package com.lzy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/*SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
        String value = spelExpressionParser
        									.parseRaw("new String('hello world').toUpperCase()").getValue(String.class);*/

/*
	Jwt 拦截器方面：
		1、自定义类实现 `OncePerRequestFilter` 接口在充血方法中主要**获取用户的token信息并校验，设置 `SecurityContextHolder.getContext().setAuthentication( Params ）`信息**
		2、在 `WebSecurityConfigurerAdapter` 实现类中以下配置
				.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
	登入登出认证方面：
		1、登入：
				0.前置条件
						1）LoginUser 实现了 `UserDetails` 接口
						2）LoginUser 提供了 `Set<Permission> permission` 字段用于页面功能权限验证
						3）LoginUser 提供了 `SysUser（与 sysUser表对应）` 字段，其中该类中包含了 List<SysRole> roles 字段，方便后期权限认证
				1.通过 WebSecurityConfigurerAdapter 配置累的 configure(AuthenticationManagerBuilder auth) 设置用户认证入口
				auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
				2.配置 '/login' 请求允许匿名访问，关闭 security 提供的 formLogin()
				3.编写 `@PostMapping("/login")` 登陆控制器方法
						public R login(String username, String password) {
				4.通过以下对象实现 `JDBC` 的认证
						@Resource
  					private AuthenticationManager authenticationManager;
  					1）调用以下方法，传入对应的参数实现校验
  							authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
  					2）创建当前用户的 `token` 信息并且返回信息
		2、登出：
				1.配置登出的 url '/logout'
				2.配置登出成功的处理器 '.logoutSuccessHandler(logoutSuccessHandler)'
				3.登出成功处理器需要自定义类实现 `LogoutSuccessHandler`
				4.处理器作用删除用户的 redis 缓存记录，响应对应的登出成功信息！

	权限方面：
		1、自定义 hasPermi 和 hasRole 认证方式，不采用 security 自带的 hasRole....
		2、权限认证: (防止越级操作)
				1.由 LoginUser（UserDetails 实现累） 提供用户的权限信息 Set<String> permissions;
				2.由 SysUser 提供用户的角色信息 Set<SysRole> roles;
 */
//@SpringBootApplication(scanBasePackages = "com.lzy")
@SpringBootApplication
// 表示通过aop框架暴露该代理对象,AopContext能够访问
@EnableAspectJAutoProxy(exposeProxy = true)
public class LZYApplication {

	public static void main(String[] args) {
		SpringApplication.run(LZYApplication.class, args);
		System.out.println("" +
						"__/\\\\\\\\\\\\________________________________        \n" +
						" _\\////\\\\\\________________________________       \n" +
						"  ____\\/\\\\\\_____________________/\\\\\\__/\\\\\\_      \n" +
						"   ____\\/\\\\\\_____/\\\\\\\\\\\\\\\\\\\\\\___\\//\\\\\\/\\\\\\__     \n" +
						"    ____\\/\\\\\\____\\///////\\\\\\/_____\\//\\\\\\\\\\___    \n" +
						"     ____\\/\\\\\\_________/\\\\\\/________\\//\\\\\\____   \n" +
						"      ____\\/\\\\\\_______/\\\\\\/_______/\\\\_/\\\\\\_____  \n" +
						"       __/\\\\\\\\\\\\\\\\\\__/\\\\\\\\\\\\\\\\\\\\\\_\\//\\\\\\\\/______ \n" +
						"        _\\/////////__\\///////////___\\////________");
	}
}
